package com.fhzn.boss.web.converter;

import com.fhzn.boss.context.RequestContext;
import com.fhzn.boss.entity.Tag;
import com.fhzn.boss.entity.TagExtension;
import com.fhzn.boss.entity.TagType;
import com.fhzn.boss.web.request.UpdateDictRequest;
import com.fhzn.boss.web.request.UpdateLevelRequest;
import com.fhzn.boss.web.vo.TagExportVO;
import com.fhzn.boss.web.vo.TagVO;
import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author fhzn
 */
public interface TagConverter {

    /**
     * 字典/标签实体转 vo
     *
     * @param tag 实体
     * @return vo
     */
    static TagVO fromTag(Tag tag) {
        TagVO vo = new TagVO().setId(tag.getId())
                .setParentId(tag.getParentId())
                .setType(tag.getType())
                .setCode(tag.getCode())
                .setName(tag.getName())
                .setSort(tag.getSort())
                .setAppCode(tag.getAppCode())
                .setComment(tag.getComment())
                .setCreator(tag.getCreator())
                .setCreatedTime(tag.getCreatedTime())
                .setModifier(tag.getModifier())
                .setUpdatedTime(tag.getUpdatedTime());
        if (!Objects.isNull(tag.getExtension())) {
            vo.setExtension(tag.getExtension());
        } else {
            vo.setExtension(new TagExtension());
        }
        return vo;
    }

    /**
     * 导出字典/标签实体转 vo
     *
     * @param tag 实体
     * @return vo
     */
    static TagExportVO fromExportTag(Tag tag) {
        TagExportVO vo = new TagExportVO()
                .setParentId(tag.getParentId())
                .setType(tag.getType())
                .setCode(tag.getCode())
                .setName(tag.getName())
                .setSort(tag.getSort())
                .setComment(tag.getComment());
        if (!Objects.isNull(tag.getExtension())) {
            vo.setExtension(tag.getExtension());
        } else {
            vo.setExtension(new TagExtension());
        }
        return vo;
    }

    /**
     * 更新字典/标签请求转实体
     *
     * @param request 请求
     * @return 实体
     */
    static Tag toTag(UpdateDictRequest request) {
        Tag tag = new Tag().setId(request.getId())
                .setParentId(request.getParentId())
                .setType(request.getType())
                .setCode(request.getCode())
                .setName(request.getName())
                .setIfHidden(false)
                .setSort(request.getSort())
                .setAppCode(request.getAppCode())
                .setComment(request.getComment())
                .setIfDeleted(false);
        if (request.getExtension() == null) {
            tag.setExtension(new TagExtension());
        } else {
            tag.setExtension(request.getExtension());
        }
        tag.setModifier(RequestContext.getRequestData().getHandler());
        if (!Objects.isNull(request.getId())) {
            tag.setCreator(RequestContext.getRequestData().getHandler());
        }
        return tag;
    }

    /**
     * 更新字典/标签层级请求转实体
     *
     * @param request 请求
     * @return 实体
     */
    static Tag toTag(UpdateLevelRequest request) {

        Tag tag = new Tag().setId(request.getId())
                .setParentId(request.getParentId())
                .setType(request.getType())
                .setCode("")
                .setName(request.getName())
                .setIfHidden(false)
                .setSort(0)
                .setAppCode(request.getAppCode())
                .setComment(request.getComment())
                .setIfDeleted(false);
        if (request.getExtension() == null) {
            tag.setExtension(new TagExtension());
        } else {
            tag.setExtension(request.getExtension());
        }
        tag.setModifier(RequestContext.getRequestData().getHandler());
        if (!Objects.isNull(request.getId())) {
            tag.setCreator(RequestContext.getRequestData().getHandler());
        }
        return tag;
    }

    /**
     * 字典/标签类型转VO
     *
     * @param tagType 字典类型
     * @return vo
     */
    static TagVO fromTagClassify(TagType tagType) {
        return new TagVO().setId(tagType.getId())
                .setType(tagType.getType())
                .setCode(tagType.getCode())
                .setName(tagType.getName())
                .setAppCode(tagType.getAppCode())
                .setSort(tagType.getSort())
                .setComment(tagType.getComment())
                .setCreator(tagType.getCreator())
                .setCreatedTime(tagType.getCreatedTime())
                .setModifier(tagType.getModifier())
                .setCreatedTime(tagType.getCreatedTime())
                .setUpdatedTime(tagType.getUpdatedTime());
    }

    /**
     * 实体列表转vo列表
     *
     * @param tags 实体
     * @return vo
     */
    static List<TagExportVO> fromTagList(List<Tag> tags) {
        if (CollectionUtils.isEmpty(tags)) {
            return Lists.newArrayList();
        }
        return tags.stream().map(TagConverter::fromExportTag).collect(Collectors.toList());
    }

    /**
     * vo转实体
     *
     * @param tagVO vo
     * @return 实体
     */
    static Tag fromTagVO(TagVO tagVO) {
        Tag tag = new Tag();
        if (tagVO.getExtension() == null) {
            tag.setExtension(new TagExtension());
        } else {
            tag.setExtension(tagVO.getExtension());
        }
        return tag
                .setParentId(tagVO.getParentId())
                .setType(tagVO.getType())
                .setCode(tagVO.getCode())
                .setName(tagVO.getName())
                .setSort(tagVO.getSort())
                .setAppCode(tagVO.getAppCode())
                .setComment(tagVO.getComment());
    }
}
